package com.fary.feign;

import feign.Contract;
import feign.Feign;
import feign.Logger;
import feign.Request;
import feign.auth.BasicAuthRequestInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;

/**
 * 在启动类上加 @EnableFeignClients 注解，如果你的 Feign 接口定义跟你的启动类不在同一个包名下，
 * 还需要制定扫描的包名 @EnableFeignClients（basePackages=“com.fangjia.api.client”）
 *
 * # 链接超时时间
 * feign.client.config.feignName.connectTimeout=5000
 * # 读取超时时间
 * feign.client.config.feignName.readTimeout=5000
 * # 日志等级
 * feign.client.config.feignName.loggerLevel=full
 * # 重试
 * feign.client.config.feignName.retryer=com.example.SimpleRetryer
 * # 拦截器
 * feign.client.config.feignName.requestInterceptors[0]=com.example.FooRequestInterceptor
 * feign.client.config.feignName.requestInterceptors[1]=com.example.BarRequestInterceptor
 * # 编码器
 * feign.client.config.feignName.encoder=com.example.SimpleEncoder
 * # 解码器
 * feign.client.config.feignName.decoder=com.example.SimpleDecoder
 * # 契约
 * feign.client.config.feignName.contract=com.example.SimpleContract
 */
@Configuration
public class FeignConfiguration {
    /**
     * 日志级别
     * NONE：不输出日志。
     * BASIC：只输出请求方法的 URL 和响应的状态码以及接口执行的时间。
     * HEADERS：将 BASIC 信息和请求头信息输出。
     * FULL：输出完整的请求信息。
     *
     * 在配置文件中执行 Client 的日志级别才能正常输出日志，格式是“logging.level.client 类地址=级别”。
     * logging.level.com.fary.feign.UserFeign=DEBUG
     */
    @Bean
    Logger.Level feignLoggerLevel() {
        return Logger.Level.FULL;
    }


    /**
     * 加了这个配置，就不支持SpringMVC的注解了
     *  Spring Cloud 中使用原生的注解方式来定义客户端也是可以的，通过配置契约来改变这个配置，
     *  Spring Cloud 中默认的是 SpringMvcContract
     * @return
     */
    @Bean
    public Contract feignContract() {
        return new feign.Contract.Default();
    }

    /**
     * Basic 认证配置
     * @return
     */
    @Bean
    public BasicAuthRequestInterceptor basicAuthRequestInterceptor() {
        return new BasicAuthRequestInterceptor("feign", "feign");
    }

    /**
     * 超时时间配置：
     * Options 的第一个参数是连接超时时间（ms），默认值是 10×1000；第二个是取超时时间（ms），默认值是 60×1000。
     * @return
     */
    @Bean
    public Request.Options options() {
        return new Request.Options(5000, 10000);
    }

    /**
     * 客户端组件配置
     * Feign 中默认使用 JDK 原生的 URLConnection 发送 HTTP 请求，我们可以集成别的组件来替换掉 URLConnection，比如 Apache HttpClient，OkHttp。
     *
     * 配置 OkHttp 只需要加入 OkHttp 的依赖，代码如下所示。
     * <dependency>
     *     <groupId>io.github.openfeign</groupId>
     *     <artifactId>feign-okhttp</artifactId>
     * </dependency>
     *
     * 然后修改配置，将 Feign 的 HttpClient 禁用，启用 OkHttp，配置如下：
     * #feign 使用 okhttp
     * feign.httpclient.enabled=false
     * feign.okhttp.enabled=true
     */


    /**
     * GZIP 压缩配置
     * 开启压缩可以有效节约网络资源，提升接口性能，我们可以配置 GZIP 来压缩数据：
     * feign.compression.request.enabled=true
     * feign.compression.response.enabled=true
     *
     * 还可以配置压缩的类型、最小压缩值的标准：
     * feign.compression.request.mime-types=text/xml,application/xml,application/json
     * feign.compression.request.min-request-size=2048
     */


    /**
     * Feign 中禁用 Hystrix
     * feign.hystrix.enabled=false
     * 或者通过下面代码禁用
     */
    @Bean
    @Scope("prototype")
    public Feign.Builder feignBuilder() {
        return Feign.builder();
    }
}